// 标签页管理仓库
import {
	defineStore
} from "pinia"


import ChatType from "@/type/ChatType/ChatType.vue"
import HomeType from "@/type/HomeType.vue"
import FindFriend from "@/type/FindFriend.vue"
import EmailList from "@/type/EmailType/EmailList.vue"
import SelfMessage from "@/type/SelfMessage.vue"

// 通用类型的界面数据
class Use {
	constructor(TabObj) {
		// 获取传入的值
		this.title = TabObj.title;
		this.name = TabObj.name;

		//设置固定的属性值
		this.type = "use";
		this.icon = "Grid";
		this.isShow = true; //是否显示
		this.repeat = false; //是否允许重复
		this.closeType = "clear"; //关闭类型，close关闭显示，clear清除
	}
}

// 私聊标签页,继承自通用页面
class PC extends Use {
	constructor(TabObj) {
		super(TabObj);
		// 设置子类的属性
		this.unread = 0;
		this.FrameType = ChatType;
		this.icon = "Comment";
		this.type = "PC";
		this.closeType = "close"
		// 保存聊天对象的相关信息
		this.friendMessage = TabObj.friendMessage;
	}
}

// 首页类型
class HOME extends Use {
	constructor(TabObj) {
		super(TabObj);
		// 设置子类的属性
		this.FrameType = HomeType;
		this.icon = "Box";
		this.type = "system";
		this.imgList = TabObj.imgList;
	}
}
// 搜索好友的类型
class FINDFRIEND extends Use {
	constructor(TabObj) {
		super(TabObj);
		// 设置子类的属性
		this.FrameType = FindFriend;
		this.icon = "FullScreen";
		this.type = "system";
	}
}

// 邮件列表类型
class EMAILLIST extends Use {
	constructor(TabObj) {
		super(TabObj);
		// 设置子类的属性
		this.FrameType = EmailList;
		this.icon = "Message";
		this.type = "system";
	}
}

// 我的账户信息类型
class SELFMESSAGE extends Use {
	constructor(TabObj) {
		super(TabObj);
		// 设置子类的属性
		this.FrameType = SelfMessage;
		this.icon = "Umbrella";
		this.type = "system";
	}
}


// 获取该好友的相关信息，并保存
import useFriend from "@/store/friend.js"

// 声明一个叫做user的库
let useTabUnit = defineStore("tabUnit", {
	state: () => {
		return {
			// 当前的页面对象
			Frame: "HOME",
			tabList: [
				new HOME({
					title: '主页', //用来显示标签页标题
					name: 'HOME', //标签页的唯一名称(主键)
					imgList: ["homeimg/home1.jpeg", "homeimg/home2.jpeg", "homeimg/home3.png",
						"homeimg/home4.png", "homeimg/home5.png", "homeimg/home6.png",
					]
				}),
				// new FINDFRIEND({
				// 	title: '搜索好友',
				// 	name: 'FINDFRIEND',
				// }),
				// new EMAILLIST({
				// 	title: '邮件信息',
				// 	name: 'EMAILLIST',
				// }),
				// new SELFMESSAGE({
				// 	title: '我的信息',
				// 	name: 'SELFMESSAGE',
				// }),
			]
		}
	},
	getters: {
		// 获取当前显示页面的对象
		getFrame(state) {
			return state.Frame;
		},
		// 获取所有的标签页列表
		getTabList(state) {
			return state.tabList.filter(item => item.isShow);
		},
	},
	actions: {
		// newTitle是标签页的标题
		// newName是标签页的唯一识别码，在这里使用聊天对象的id
		addChat(newTitle, newName) {
			// 当新增聊天对象的时候，需要检查是否已经存在该对象了
			// 如果存在，那么就是显示这个页面，而非增加数组
			let flag = false;

			// 如果聊天列表已经存在
			for (let key in this.tabList) {
				// 对比需要新增的值，和已经存在的值
				if (this.tabList[key].name == newName) {
					this.tabList[key].isShow = true;
					flag = true;
					break;
				}
			}
			if (flag) {
				// 如果已经存在，则不新增，直接定位
				this.Frame = newName;
			} else {

				// 获取用户的相关信息，保存到聊天中
				let friendData = useFriend();
				let friendMessage = friendData.findIndexById(newName);

				if (friendMessage == -1) {
					return null;
				} else {
					// 新建聊天对象
					let newPC = new PC({
						title: newTitle,
						name: newName,
						friendMessage
					});

					this.tabList.push(newPC)
				}

				// 是将标签页的显示，定位到新的聊天页面
				this.Frame = newName;
			}
		},
		//查找一个确定存在的单元并显示
		showTab(name) {
			for (let key in this.tabList) {
				// 对比需要新增的值，和已经存在的值
				if (this.tabList[key].name == name) {
					this.tabList[key].isShow = true;
					this.Frame = name;
					break;
				}
			}
		},
		// 删除一个页面
		removeTab(targetName) {
			this.tabList.forEach((tab, index) => {
				if (tab.name === targetName) {
					// 设置不显示或者清除对象close关闭显示，clear清除数据
					switch (tab.closeType) {
						case "close":
							tab.isShow = false;
							break;
						case "clear":
							this.tabList.splice(index, 1);
							break;
						default:
							tab.isShow = false;
							break;
					}

					const nextTab = this.tabList[index + 1] || this.tabList[index - 1];
					if (nextTab) {
						// 更新显示标签页  
						this.Frame = nextTab.name;
					}
				}
			});
		},
		addTab(type){
			switch (type) {
				case "FINDFRIEND":
					this.createInstance(type, {
						title: '搜索好友',
						name: 'FINDFRIEND'
					})
					break;
					case "EMAILLIST":
					this.createInstance(type, {
						title: '邮件信息',
						name: 'EMAILLIST'
					})
					break;
					case "SELFMESSAGE":
					this.createInstance(type, {
						title: '我的信息',
						name: 'SELFMESSAGE'
					})
					break;
				default:
					break;
			}
		},
		// 类工厂模式
		// 根据用户需求创建对应类
		createInstance(type, TabObj) {
			// 检查列表中是否已经有同名页面
			const HaveTab = this.tabList.find(tab => tab.name == TabObj.name);

			// 如果该页面已存在
			if (HaveTab) {
				// 检查标签页是否允许重复创建
				if (!HaveTab.repeat) {
					// 如果不允许则显示现有页面并退出
					HaveTab.isShow = true;
					this.Frame = HaveTab.name;
					return HaveTab;
				}
			}

			// 通过前面的检查，才允许创建
			const classes = {
				'HOME': HOME,
				'FINDFRIEND': FINDFRIEND,
				"EMAILLIST": EMAILLIST,
				"SELFMESSAGE": SELFMESSAGE
			};

			// 如果找不到对应的类，则使用通用类Use
			const ClassName = classes[type] || Use;

			let Tab = new ClassName(TabObj)
			// 将页面加入列表
			this.tabList.push(Tab)
			this.Frame = Tab.name;
			return Tab;
		}
	}
})


// 默认导出仓库对象
export default useTabUnit